package com.zte.claa.inficombo.csa.app.service.csa;

import java.util.List;
import java.util.Map;

import com.zte.claa.inficombo.csa.app.controller.ret.AppStatus;
import com.zte.claa.inficombo.csa.app.model.app.AppTarget;

public interface CSAMainService {

	// 添加AppEUI和CSIF的关联
	public void addAppEui(String appeui, AppTarget appTarget) throws Exception;
	
	// 删除AppEUI关联
	public void removeAppEui(String appeui) throws Exception;
	
	// 返回当前CSA代理服务器所支持的AppEUI列表
	public List<String> getAppEuis();
	
	// 返回appeui对应的apptarget
	public AppTarget getAppTarget(String appeui);
		
	// 查询到CSIF的链路状态.
	public AppStatus getAppLinkState(String appeui);
	
	// -----------------------  下行命令相关方法 ----------------------------//
	/**
	 * CS JOIN.
	 * @param appEui  --->需要在CSA中已经存在的AppEUI；
	 * @return  -->json字符串；
	 * @throws Exception 
	 */
	public String CSJoin(String appEui) throws Exception;
	
	/**
	 * CS Quit
	 * @param appEui --->需要在CSA中已经存在的AppEUI；
	 * @return  -->json字符串；
	 * @throws Exception
	 */
	public String CSQuit(String appEui) throws Exception;
	
	/**
	 * 设备控制命令下发
	 * 
	 * @param appEeui
	 * @param devEui
	 * @param confirm
	 * @param payload -->符合设备控制模型的json字符串： {"cmd":"cmdname", "paras":{"p1":"v1", "p2":"v2", ...}} 
	 * @param port  [1,200] 0--无效；
	 * @return   -->json字符串；
	 * @throws Exception
	 */
	public String SendDevCtrlCmd(String appEui, String devEui, boolean confirm, int port, String payload, Map<String, Object> extParaMap) throws Exception;
	
	/**
	 * 设备控制命令下发
	 * 
	 * @param appEeui
	 * @param devEui
	 * @param confirm
	 * @param payload -->符合设备控制模型的json字符串： {"cmd":"cmdname", "paras":{"p1":"v1", "p2":"v2", ...}} 
	 * @param port  [1,200] 0--无效；
	 * @return   -->json字符串；
	 * @throws Exception
	 */
	public void SendDevCtrlCmdIgnoreRsp(String appEui, String devEui, boolean confirm, int port, String payload, Map<String, Object> extParaMap) throws Exception;

	
	/**
	 * dev buff query
	 * @param appEui --->需要在CSA中已经存在的AppEUI；
	 * @param devEui 
	 * @return  -->json字符串；
	 * @throws Exception
	 */
	public String DevBuffQuery(String appEui, String devEui) throws Exception;
	
	/**
	 * dev class query
	 * @param appEui --->需要在CSA中已经存在的AppEUI；
	 * @param devEui 
	 * @return  -->json字符串；
	 * @throws Exception
	 */
	public String DevClassQuery(String appEui, String devEui) throws Exception;
	
	/**
	 * dev state query
	 * @param appEui --->需要在CSA中已经存在的AppEUI；
	 * @param devEui 
	 * @return  -->json字符串；
	 * @throws Exception
	 */
	public String DevStateQuery(String appEui, String devEui) throws Exception;
	
	/**
	 * 广播命令下发
	 * 
	 * @param appEui
	 * @param port  
	 * @param times  该字段的取值范围为1~5，即一条广播消息最少进行一次广播，最多可以进行5次广播。 MSP上每隔10秒广播一次.
	 * @param payload
	 * @return
	 * @throws Exception
	 */
	public String SendBcastCmd(String appEui, int port, int times, String devTypeId, String payload, Map<String, Object> extParaMap) throws Exception;
	
	/**
	 * 组播密钥查询
	 * 
	 * @param appEui
	 * @return
	 * @throws Exception
	 */
	public String BcastQueueQuery(String appEui) throws Exception;
	
	// ------------------------- CSIF DEV CRUD ---仅针对LNS系统可用 ----------------// 
	/**
	 * 添加dev
	 * appkey = null || "" 表示不设置；
	 * clazz = null || "" 表示A类型；
	 * offlineTime <= 0 表示不设置（使用LNS默认值）
	 * @param appEui
	 * @param devEui
	 * @param appkey
	 * @param clazz
	 * @param offlineTime
	 * @return
	 * @throws Exception
	 */
	public String addDev(String appEui, String devEui, String appkey, String clazz, int offlineTime) throws Exception;
	
	// 删除设备.
	public String removeDev(String appEui, String devEui) throws Exception;

	// 修改设备.
	public String modifyDev(String appEui, String devEui, int offlineTime) throws Exception;
	
	// 查询设备.
	public String queryDev(String appEui, String devEui) throws Exception;
	
}
